package gdr.map;


public class BattleMap {
	
	protected int width;
	protected int height;
	
	protected BattleMapUnit[][] map;
	
	public BattleMap(){
		this(1,1);
	}
	public BattleMap(int width, int height)
	{	map = new BattleMapUnit[width][height];
		setWidth(width);
		setHeight(height);
	}
	
	/**
	 * Aggiunge una nuova cella alla mappa, se la cella ha coordinate non valide, non modifica nulla.
	 * Se la posizione indicata era gia' occupata, la sovrascrive.
	 * @param u
	 */
	public boolean addBattleMapUnit(BattleMapUnit u){
		if (!positionExists(u.getPos())) return false;
		map[u.getPos().getX()][u.getPos().getY()] = u;
		return true;
	}
	/**
	 * Verifica se la posizione indicata e' rappresentabile in questa mappa
	 * @param pos
	 * @return
	 */
	protected boolean positionExists(Position pos)
	{	return 	pos.getX()>=0 && pos.getX()<width &&
				pos.getY()>=0 && pos.getY()<height &&
				pos.getZ()>=0;
	}
	
	/**
	 * Restituisce l'unita' indicata. null se non esiste.
	 * @param pos
	 * @return se la posizione e' valida, restituisce la cella, altrimenti restituisce null.
	 */
	public BattleMapUnit getBattleMapUnit(Position pos)
	{	try{	return map[pos.getX()][pos.getY()];
		}
		catch(Exception e)
		{	return null;
		}
	}
	
	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	public BattleMapUnit[][] getMap() {
		return map;
	}
	public void setMap(BattleMapUnit[][] map) {
		this.map = map;
	}

	@Override
	public String toString() {
		String s= "BattleMap [width=" + width + ", height=" + height + ", map=";
		for (int i=0; i<width; i++)
		{	s+="\n<";
			for (int j=0; j<height; j++)
				s+=getBattleMapUnit(new Position(i,j,0));
			s+=">";
		}
		s+="]";
		return s;
	}

}
